/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication2;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Leonardo
 */
public class Escalonador extends Thread{
    private ArrayList<Processo> processos;
    private int indexProcessoAtual = 0;
    private final int ROUND_ROBIN_CPU_BURST_TIME = 1000;
    public Escalonador(ArrayList<Processo> processos)
    {
        this.processos = processos;
    }
    
    
    @Override
    public void run()
    {
        Thread threadEscalonador = Thread.currentThread();        
        threadEscalonador.setPriority(6);
        do
        {
            this.iniciarProximoProcesso();
            System.out.println("Executando " + processos.get(indexProcessoAtual).getId());
            try {
                threadEscalonador.sleep(ROUND_ROBIN_CPU_BURST_TIME);
                this.pausarProcessoAtual();                
            } catch (InterruptedException ex) {
                Logger.getLogger(Escalonador.class.getName()).log(Level.SEVERE, null, ex);
            }
        } while((indexProcessoAtual = this.getIndexProximoProcesso()) != -1);        
    }
    
    protected void iniciarProximoProcesso()
    {        
        Processo processoAtual = processos.get(indexProcessoAtual);
        if(!processoAtual.getThread().isAlive())
            processoAtual.getThread().start();
        processoAtual.getThread().setPriority(4);
    }
    
    protected void pausarProcessoAtual() throws InterruptedException
    {
        Processo processoAtual = processos.get(indexProcessoAtual);
        processoAtual.addTempoUsado(ROUND_ROBIN_CPU_BURST_TIME);        
        processoAtual.getThread().setPriority(2);
    }
    
    protected int getIndexProximoProcesso()
    {
        int indexProximoProcesso = -1;
        int s = indexProcessoAtual;
        for(int i = 0; i < processos.size(); ++i)
        {            
            s = (s + 1) % processos.size();
            if(!processos.get(s).IsFinalizado())            
            {
                indexProximoProcesso = s;
                break;
            }   
        }
        return indexProximoProcesso;
    }
}
